package main

import "fmt"

var z int

//wrapper 返回值为一个匿名函数，该匿名函数的返回为另一个匿名函数，第二个匿名函数返回x,y
//为了方便演示，定义第一个匿名函数为A，第二个为B
func wrapper(z *int) func() func() (x int, y int) {
	x := 8 //这里改大一点方便查看
	*z++
	fmt.Println("wrapper中x为",x)
	return func() func() (x int, y int) {
		x++
		fmt.Println("匿名函数A中x为",x)
		return func() (c int, y int) {
			fmt.Println("匿名函数B中x-1为",x)
			x++
			c = x
			fmt.Println("匿名函数B中x为",x)  //问题1：这里为啥是0
			y = *z + 1
			return
		}
	}
}

func main() {
	//z默认为0
	increment := wrapper(&z) //increment实际上是匿名函数A
	fmt.Println(increment()()) //执行A，打印x，y
	fmt.Println(z)// 打印z
	fmt.Println("===================================")
	z++
	fmt.Println(z)
	fmt.Println(increment()())

	//02拓展（先修改B中的X返回）
	fmt.Println("===================================")
	ff := increment() //此时在b中，x,y,z都是什么值
	fmt.Println("函数赋值给ff的时候并没有执行匿名函数b")
	fmt.Println(ff())
	fmt.Println(ff())
	fmt.Println(increment()()) //但是匿名函数A中的变量依旧是会使用的

}